package com.weiqiao.api.until.service;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 可自行扩展
 * @author Zheng Jie
 * @date 2018-12-10
 */
public interface RedisApiService {

    /**
     * 自定义存储
     * @param key
     * @param val
     */
    void customSave(String key, Object val, long timeout, TimeUnit unit);

    /**
     * 获取自定义存储
     * @param key
     * @return
     */
    String getCustomSaveVal(String key);

    /**
     * findById
     * @param key
     * @return
     */
    Page findByKey(String key, Pageable pageable);

    /**
     * 查询验证码的值
     * @param key
     * @return
     */
    String getCodeVal(String key);

    /**
     * 保存验证码
     * @param key
     * @param val
     */
    void saveCode(String key, Object val);

    /**
     * delete
     * @param key
     */
    void delete(String key);

    /**
     * 清空所有缓存
     */
    void flushdb();
    
    /**
     * 缓存key
     * @param key
     * @param val
     */
    void set(String key, Object val);
    
    /**
     * 获取指定key的value
     * @param key
     * @param val
     */
    String get(String key);
    
    /**
     * 缓存hash
     * @param key
     * @param val
     */
    void hset(String key, String hashKey, Object val);

    /**
     * 缓存hash
     * @param key
     * @param hashKey
     * @param val
     * @param outdate 过期时间
     */
    void  hsetForDate(String key, String hashKey, Object val, int outdate);
    
    /**
     * 获取指定key的hash值
     * @param key
     * @param val
     */
    String hget(String key, String hashKey);
    
    /**
     * 获取所有key的hash值
     * @param key
     * @param val
     */
    Map hgetAll(String key);
    
    /**
     * delete
     * @param key
     */
    void hdelete(String key, String hashKey);



    /**
     * 获取list缓存的长度
     * @param key 键
     * @return
     */
    long lGetListSize(String key);

    /**
     * 获取list缓存的内容
     * @param key 键
     * @param start 开始
     * @param end 结束  0 到 -1代表所有值
     * @return
     */
    public List<Object> lGet(String key, long start, long end);

    /**
     * 判断key是否存在
     * @param key
     * @return
     */
    public boolean exist(String key);

    /**
     * 通过索引 获取list中的值
     * @param key 键
     * @param index 索引  index>=0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return
     */
    public Object lGetIndex(String key, long index);

    /**
     * 将key放入缓存
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean rPush(String key, Object value);

    /**
     * 将key放入缓存
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean lPush(String key, Object value);

    /**
     * 移除该key最右边的元素
     * @param key 键
     * @return
     */
    public boolean rPop(String key);

    /**
     * 移除该key最左边的元素
     * @param key 键
     * @return
     */
    public boolean lPop(String key);

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean rPushAll(String key, List<Object> value);

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean lPushAll(String key, List<Object> value);

    /**
     * 根据索引修改list中的某条数据
     * @param key 键
     * @param index 索引
     * @param value 值
     * @return
     */
    public boolean lUpdateIndex(String key, long index, Object value);

    /**
     * 移除N个值为value
     * @param key 键
     * @param count 移除多少个
     * @param value 值
     * @return 移除的个数
     */
    public long lRemove(String key, long count, Object value);
}
